package com;

import org.ns.framework.datasource.anns.DBSource;
import org.ns.framework.datasource.config.Redis;
import org.ns.framework.datasource.mybatis.CommitResult.CommitException;
import org.ns.framework.datasource.mybatis.TransactonManage;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

@Service
@Lazy
public class TestService {
	
	@DBSource("default-db") // 选择一个数据源
	TestMapper testMapper;  // 操作数据库的BD
	
	@DBSource("default-redis") // 选择一个数据源
	Redis redis;
	
	public void printTestOne() {
		int value = testMapper.selectOne();
		System.out.println(value);
	}
	
	/**
	 * 事物提交示范案例
	 */
	public void transTest() {
		testMapper.selectOne(); // 自动释放. 没有事物
		
		try (TransactonManage tx = TransactonManage.create()) { // 开启事物
			
			// mapper 执行操作 1
			// mapper 执行操作 2
			// mapper 执行操作 n...
			
			
			tx.commit().throwCommitException(); // 提交事物, 如果提交失败则发生异常
			
			//  自动关闭事物 - 不需要手动 close
		} catch (CommitException e) {
			// 提交失败可以处理失败的过程. [自动回滚]
		} catch (Exception e) {
			// 发生其他异常失败 则提交也失败. [自动回滚]
		}
		
		testMapper.selectOne(); // 自动释放. 没有事物
	}
	
	
	public void redisTest() {
		
		// redis 普通的执行操作
		redis.execute(jedis -> {
			return jedis.get("abc");
		});// 方法结束会释放jedis
		
		// 自动释放jedis 每执行一个命令就释放一次.
		redis.executeProxy(jedis -> { 
			return jedis.get("abc");
		});
		
		// 开启事物提交
		redis.transExec(jedis->{
			jedis.set("abc", "1000");
		});
		
		// 原子执行, 分布式乐观锁
		redis.atomicExec("lockkeyName", 10, ()->{
			return "我被执行了";
		});
		
	}
	
}
